﻿// D. Sum of XOR Functions.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//
/*
https://codeforces.com/problemset/problem/1879/D

给你一个长度为 n、由非负整数组成的数组 a。

您必须计算 ∑nl=1∑nr=lf(l,r)⋅(r-l+1) 的值，其中 f(l,r) 是 al⊕al+1⊕⋯⊕ar-1⊕ar (字符 ⊕ 表示位向 XOR）。

由于答案可能非常大，请打印出以 998244353 为模数的答案。

输入
第一行包含一个整数 n（1≤n≤3⋅105），即数组 a 的长度。

第二行包含 n 个整数 a1,a2,...,an（0≤ai≤109）。

输出
打印一个整数 - ∑nl=1∑nr=lf(l,r)⋅(r-l+1) 的 值，取模为 998244353。

Examples
InputCopy
3
1 3 2
OutputCopy
12
InputCopy
4
39 68 31 80
OutputCopy
1337
InputCopy
7
313539461 779847196 221612534 488613315 633203958 394620685 761188160
OutputCopy
257421502


注释
在第一个例子中，答案等于 f(1,1)+2⋅f(1,2)+3⋅f(1,3)+f(2,2)+2⋅f(2,3)+f(3,3)= =1+2⋅2+3⋅0+3+2⋅1+2=12
*/


#include <iostream>

using namespace std;

using ll = long long;
const int N = 3e5 + 9;
const ll p = 998244353;
int a[N];
ll prefix[N];

ll mo(ll x) { return (x % p + p) % p; }


int main()
{
	int n; cin >> n;
	for (int i = 1; i <= n; i++) cin >> a[i];

	ll ans = 0;
	for (int w = 0; w <= 30; ++w) {
		for (int i = 1; i <= n; ++i) prefix[i] = prefix[i - 1] + (a[i] >> w & 1);
		ll c0 = 1, c1 = 0;
		ll s0 = 0, s1 = 0;
		ll res = 0;
		for (int i = 1; i <= n; i++) {
			if (prefix[i] & 1) {
				res = mo(res + c0 * i % p - s0);
				c1++;
				s1 = (s1 + i) % p;
			} 
			else {
				res = mo(res + c1 * i %p - s1);
				c0++;
				s0 = (s0 + i) % p;
			}
		}
		ans = (ans + (1ll << w) %p* res % p) % p;
	}

	cout << ans << endl;
	return 0;
}

 